//package cn.rengy.web.framework.sql;
//
//import java.io.File;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.regex.Matcher;
//import java.util.regex.Pattern;
//
//import org.apache.commons.io.FileUtils;
//import org.apache.shiro.SecurityUtils;
//import org.apache.shiro.subject.Subject;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.util.Assert;
//
//import cn.rengy.util.ExceptionPrintUtils;
//import cn.rengy.web.framework.support.SpringContextHolder;
//import cn.rengy.web.sys.user.service.UserService;
//
//
//public class SqlParser{
//	private static Logger logger = LoggerFactory.getLogger(SqlParser.class);
//	//private List<String> parameterNames = new ArrayList<String>();
//    public static final String DEF_PREFIX = "{";
//    public static final String DEF_SUFFIX = "}";
//
//	//private String sourceSql;
//	//private Map<String,Object> paramMap;
//	
//	public SqlParser() {
//		/*this.sourceSql = sourceSql;
//		Assert.notNull(sourceSql, "sql must not be null");
//		Assert.notNull(param, "param must not be null");
//		this.paramMap = param;*/
//	}
//	public static String parseSQL(String sourceSql, Map<String, Object> paramMap) {
//		if(paramMap==null)
//			paramMap=new HashMap<String, Object>();
//		StringBuilder sqlToUse=new StringBuilder();
//		char[] statement = sourceSql.toCharArray();
//		int i = 0;
//		int begin = 0;
//		int paramBegin=0;
//		int nameParameBegin=0;
//		boolean newsql=false;
//		while (i < statement.length) {
//			char c = statement[i];
//			if(c=='{'){
//				begin++;
//			}
//			if(begin==0){
//				sqlToUse.append(statement[i]);
//				if(nameParameBegin>0){
//					
//					if(i==statement.length-1||c==' '||c==','||c==')'||c=='\n'){
//						String paramName=sourceSql.substring(i-nameParameBegin+1, i);
//						if(c=='\n'){
//							paramName=sourceSql.substring(i-nameParameBegin+1, i-1);
//						}else if(i==statement.length-1&&c!=')'){
//							paramName=sourceSql.substring(i-nameParameBegin+1, i+1);
//						}
//						//logger.debug("paramName="+paramName);
//						if(!paramMap.containsKey(paramName)){
//							if(paramName.length()>12&&paramName.substring(0,12).equals("sys_session_")){
//								String newParamName=paramName.substring(12);
//								UserService userService=SpringContextHolder.getBean(UserService.class);
//								Map<String,Object> user=userService.getUserInfo();
//								Object value= user.get(newParamName);
//								paramMap.put(paramName, value);
//							}else{
//								paramMap.put(paramName, null);
//							}
//						}else{
//							 Object v=paramMap.get(paramName);
//							 if(v!=null&&v instanceof String&&v.toString().length()==0){
//								 paramMap.put(paramName, null);
//							 }
//						}
//						//parameterNames.add(paramName);
//						nameParameBegin=0;
//					}else{
//						nameParameBegin++;
//					}
//				}
//				if(c==':'){//name参数摘取
//					nameParameBegin++;
//				}
//				
//			}else{
//				begin++;
//			}
//			if(begin>0){
//				if(c==':'){
//					paramBegin++;
//				}
//				if(paramBegin>0){
//					if(c==' '||c=='}'||c==','||c=='+'||c=='-'){
//						String paramName=sourceSql.substring(i-paramBegin+2, i);
//						if(paramMap.containsKey(paramName)){
//							newsql=true;
//							Object v=paramMap.get(paramName);
//							if(v!=null&&v instanceof String&&v.toString().length()==0){
//								paramMap.put(paramName, null);
//							}
//						}else{
//							newsql=false;
//						}
//						paramBegin=0;
//					}
//					
//				}
//				if(paramBegin>0){
//					paramBegin++;
//				}
//			}
//			if(c=='}'){
//				if(begin>0){
//					String criteriaSql=sourceSql.substring(i-begin+3, i);
//					if(newsql){
//						sqlToUse.append(criteriaSql);
//					}
//					newsql=false;
//					//sqlToUse.append(replaceParam(criteriaSql));
//					begin=0;
//					paramBegin=0;
//				}
//			}
//			
//			i++;
//		}
//		return sqlToUse.toString();
//	}
//	
//	
//	public static String parseSQL2(String sourceSql,Map<String,Object> paramMap) {
//		if(paramMap==null)
//			paramMap=new HashMap<String, Object>();
//		int index=sourceSql.indexOf(DEF_PREFIX);
//		if(index==-1){
//			int sysParamIndex=sourceSql.indexOf(":sys_session");
//			if(sysParamIndex!=-1){
//				//把session变量放入map
//			}
//			return sourceSql;
//		}else{
//			StringBuilder newSql=new StringBuilder();
//			int begin=0;
//			while(index!=-1){
//				newSql.append(sourceSql.substring(begin, index));
//				//System.out.println("新的sql1="+newSql.toString());
//				int end=sourceSql.indexOf(DEF_SUFFIX, index);//条件结束index
//				String criteriaSql=sourceSql.substring(index+DEF_PREFIX.length(), end);
//				//System.out.println("subsql="+criteriaSql);
//				newSql.append(replaceParam(criteriaSql,paramMap));
//				//System.out.println("新的sql2="+newSql.toString());
//				index=sourceSql.indexOf(DEF_PREFIX,end);
//				begin=end+1;
//			}
//			newSql.append(sourceSql.substring(begin));
//			return newSql.toString();
//		}
//	}
//	
//	
//	private static String replaceParam(String criteriaSql,Map<String,Object> paramMap){
//		String newCriteriaSql=criteriaSql;
//		int index=criteriaSql.indexOf(":");
//		//System.out.println("index="+index);
//		//System.out.println("lastIndex="+lastIndex);
//		while(index!=-1){
//			int end=0;
//			String [] endchar=new String[]{" ","}",",","+","-"};
//			int l=endchar.length;
//			for(int i=0;i<l;i++){
//				end=criteriaSql.indexOf(endchar[i],index);
//				if(end!=-1){
//					break;
//				}
//			}
//			if(end==-1){
//				end=criteriaSql.length();
//			}
//			//if(c==' '||c=='}'||c==','||c=='+'){
//			//System.out.println("criteriaSql end="+end);
//			String paramName=criteriaSql.substring(index+1, end);
//			if(!paramMap.containsKey(paramName)){
//				if(paramName.length()>12&&paramName.substring(0,12).equals("sys_session_")){
//					String newParamName=paramName.substring(12);
//					UserService userService=SpringContextHolder.getBean(UserService.class);
//					Map<String,Object> user=userService.getUserInfo();
//					Object value= user.get(newParamName);
//					paramMap.put(paramName, value);
//				}else{
//					paramMap.put(paramName, null);
//				}
//			}else{
//				 Object v=paramMap.get(paramName);
//				 if(v!=null&&v instanceof String&&v.toString().length()==0){
//					 paramMap.put(paramName, null);
//				 }
//			}
//			//System.out.println("参数name=>"+paramName);
//			if(paramMap.containsKey(paramName)){
//				index=criteriaSql.indexOf(":",end);
//				continue;
//			}else{
//				newCriteriaSql= "";
//				break;
//			}
//		}
//		//System.out.println("新的子sql="+newCriteriaSql);
//		return newCriteriaSql;
//	}
//	
//	/*public static String format(String tempalte, Map<String,Object> parameters){  
//        Pattern p = Pattern.compile("({*+\\:([a-zA-Z0-9_]+[])})");//(#([a-zA-Z0-9_]+)#)
//        Matcher m = p.matcher(tempalte);  
//        StringBuffer stringBuffer = new StringBuffer();  
//        while (m.find()){
//            String key = m.group(m.groupCount());  
//            String value = "";
//            if (parameters.containsKey(key)){  
//                Object v = parameters.get(key);
//                if(v!=null){
//                	value=v.toString();
//                }
//            }
//            m.appendReplacement(stringBuffer,value);  
//        }
//        m.appendTail(stringBuffer);  
//        return stringBuffer.toString();  
//    }*/
//	
//	public static void main(String args[]){
//		try {
//			String sourceSql2 = FileUtils.readFileToString(new File("c:/office/1.sql"));
//			Map<String,Object> paramMap1=new HashMap<String,Object>();
//			paramMap1.put("owner_id", 9);
//			paramMap1.put("last_security_query_time", new Date());
//			paramMap1.put("id", 4);
//			paramMap1.put("product_no", 3);
//			paramMap1.put("b", 123);
////{owner_id=9, last_security_query_time=Sun May 28 10:07:04 CST 2017, id=4, product_no=3}
//			long starttime=System.currentTimeMillis();
//			String r=null;
//			for(int i=0;i<10000;i++){
//				r=parseSQL(sourceSql2, paramMap1);
//			}
//			long endtime=System.currentTimeMillis();
//			System.out.println(r);
//			System.out.println((endtime-starttime));
//			System.out.println(paramMap1);
//			System.out.println("------------");
//			Map<String,Object> paramMap2=new HashMap<String,Object>();
//			paramMap2.put("owner_id", 9);
//			paramMap2.put("last_security_query_time", new Date());
//			paramMap2.put("id", 4);
//			paramMap2.put("product_no", 3);
//			paramMap2.put("b", 123);
//			starttime=System.currentTimeMillis();
//			String r2=null;
//			for(int i=0;i<10000;i++){
//				r2=parseSQL2(sourceSql2,paramMap2);
//			}
//			
//			endtime=System.currentTimeMillis();
//			System.out.println(r2);
//			System.out.println((endtime-starttime));
//			System.out.println(paramMap2);
//		} catch (Exception e) {
//			logger.error(ExceptionPrintUtils.getTrace(e));
//		}
//		
//		
//	}
//	
//}
